/*
使用sync.WaitGroup来实现并发任务的同步
(wg * WaitGroup) Add(delta int)	计数器+delta
(wg *WaitGroup) Done()	计数器-1
(wg *WaitGroup) Wait()	阻塞直到计数器变为0
sync.WaitGroup内部维护着一个计数器，计数器的值可以增加和减少。例如当我们启动了N 个并发任务时，就将计数器值增加N。
每个任务完成时通过调用Done()方法将计数器减1。通过调用Wait()来等待并发任务执行完，当计数器值为0时，表示所有并发任务已经完成。
*/
package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func foo() {
	defer wg.Done() //计数器-1
	fmt.Println("foo")
	time.Sleep(time.Second)
	fmt.Println("foo end")

}

func bar() {
	defer wg.Done() //计数器-1
	fmt.Println("bar")
	time.Sleep(time.Second * 2)
	fmt.Println("bar end")
}
func main() {

	start := time.Now()
	wg.Add(2) //计数器+delta
	go foo()
	go bar()
	wg.Wait() //阻塞直到计数器变为0
	fmt.Println("程序结束，运行时间为", time.Now().Sub(start))

}
